﻿// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct list {
	int number;
	char name[30];
	int age;
	list* next;
} list;
list* creatlist() {//初始化一个环列表，成功则返回头指针
	list* headlist = (list*)malloc(sizeof(list));
	if (!headlist)  exit(1);
	headlist->next = headlist;
	return headlist;
}
list* tailinsert(list* taillist, int number, char name[30], int age) {//在链表的尾部插入一个新的节点，成功返回指向尾部节点的指针
	list* l = (list*)malloc(sizeof(list)), * a = taillist->next;
	if (!l) exit(1);
	taillist->next = l;
	l->next = a;
	l->number = number;
	strcpy(l->name, name);
	l->age = age;
	return l;
}
int printlist(list* headlist) {//遍历并输出这个环列表中的所有成员，成功则返回值为0
	if (headlist->next == headlist)  	exit(1);//判断链表是否为空
	list* l = headlist->next;//l是指指向正在读取的结构体的指针
	while (l != headlist) {
		printf("编号:%d  姓名:%s  年龄:%d\n", l->number, l->name, l->age);
		l = l->next;
	}
	return 0;
}
int deletemember(list* l) {//删除环列表中的某个节点(l->next指向的节点)，成功则返回值为0
	list* temp = l->next;
	l->next = temp->next;
	free(temp);
	return 0;
}
int destorylist(list* headlist) {//销毁这个链表，成功则返回值为0
	list* l = headlist;
	while (l->next != headlist) {
		list* temp = l;
		l = l->next;
		free(temp);
	}
	free(headlist);
	headlist = NULL;
	return 0;
}
list* readlist(list* headlist, list* beginlist, int i) {//读取链表中的某个节点，返回值为指向它前一个节点的指针
	if (headlist->next == headlist)  exit(1);//判断环列表是否为空
	while (i > 1) {
		beginlist = beginlist->next;
		i--;
		if (beginlist->next == headlist) //头节点不参与计数
			beginlist = beginlist->next;
	}
	return beginlist;
}
int main() {
	int N, number, age, S, M, X;//此处的N不只是题目目中的输入的量，还代指剩余的人数,who代指要删除的节点
	char name[30];
	list* headlist = creatlist(), * taillist = headlist, * before;//before->next指向的节点为要删除的节点
	if (!scanf("%d", &N))  exit(1);
	for (int i = 1;i <= N;i++) {
		if (!scanf("%d %s %d", &number, name, &age))  exit(1);
		taillist = tailinsert(taillist, number, name, age);
	}
	printlist(headlist);
	if (!scanf("%d %d %d", &S, &M, &X)) exit(1);
	if (S > N || X > N || X < 0) exit(1);//判断输入的S,N,X是否合理
	list* beginlist = readlist(headlist, headlist, S);//找出开始报数的人
	while (N > X) {
		before = readlist(headlist, beginlist, M);
		beginlist = before;
		printf("%d\n", (before->next)->number);
		deletemember(before);
		N--;
	}
	printlist(headlist);
	destorylist(headlist);
	return 0;
}

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
